package com.wangyf.thread2;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 与 T06_interrupt_sync_lock 配合可以看出：线程争抢锁 如果设置了打断标志位， 那么不会抛出异常。
 * 这个类测试 如果线程在争抢锁的时候，如何设置标志位后可以抛出异常，供我们在catch中进行操作。
 * @author: wangyf
 * @date: 2021/7/19 20:20
 */
public class T07_interrupt_lockInterruptibly {

    public static final Lock lock = new ReentrantLock();

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            try {
                lock.lock();
                TimeUnit.SECONDS.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        });
        t.start();
        TimeUnit.SECONDS.sleep(1);

        Thread t2 = new Thread(() -> {
            try {
                // 使用 lock.lock(); 设置了中断位，也不会抛出异常
                //lock.lock();
                // 使用 lock.lockInterruptibly(); 会抛出异常
                lock.lockInterruptibly();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
            System.out.println("t2 end");
        });
        t2.start();
        TimeUnit.SECONDS.sleep(2);
        t2.interrupt();
    }
}
